package com.cheifsteam.springframework.beans.factory.config;

import com.cheifsteam.springframework.beans.BeansException;

/**
 * 实例化感知的Bean后处理器接口，扩展自BeanPostProcessor，
 * 允许在Bean实例化前后进行干预
 *
 * @author qrx
 * @date 2025/8/6
 * @description: Spring容器扩展接口，用于自定义Bean实例化过程
 *
 * 这是Spring框架中强大的扩展点之一，允许开发者：
 * 1. 完全接管某些Bean的实例化过程
 * 2. 在实例化前后执行自定义逻辑
 * 3. 实现高级依赖注入策略
 */
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {

    /**
     * 在Bean实例化前执行的回调方法
     *
     * @param beanClass 目标Bean的Class对象
     * @param beanName Bean在容器中的名称
     * @return 如果返回非null对象，则Spring会使用该对象作为Bean实例，
     *         不再执行默认的实例化流程；返回null则继续正常实例化
     * @throws BeansException 如果处理过程中发生错误
     *
     * 典型应用场景：
     * 1. 为特定接口创建代理对象（如MyBatis的Mapper接口）
     * 2. 实现自定义的实例化逻辑（如从缓存中获取Bean）
     * 3. 阻止某些Bean的实例化（返回非null的空对象）
     *
     * 注意：此方法的执行时机早于Bean的构造函数调用
     */
    Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;
}